package ltd.dujiabao.buffer;

import org.junit.Test;

import java.nio.ByteBuffer;

/**
 * @author : DuJiabao
 * @Project : io_test
 * @Time : 2021/5/30 19:28
 * @Desc :
 */
public class ByteBufferTest {
  @Test
  public void testBuffer() {
    //ByteBuffer byteBuffer = ByteBuffer.allocate(10);
    ByteBuffer byteBuffer = ByteBuffer.allocateDirect(10);
    // 放入一个内容
    byteBuffer.put("curley".getBytes());  // 6个字节的内容
    System.out.println("byteBuffer.position(): " + byteBuffer.position()); // 当前指针位置，已经到 6 位置了
    System.out.println("byteBuffer.limit(): " + byteBuffer.limit()); // 对于写操作没什么用，一直呆在总量 10
    System.out.println("byteBuffer.capacity(): " + byteBuffer.capacity());  // 总量 10
    System.out.println("byteBuffer.hasRemaining(): " + byteBuffer.hasRemaining()); // true，是否还有存量
    System.out.println("byteBuffer.remaining(): " + byteBuffer.remaining());  // 4，剩余位置
    System.out.println("*************************");

    byteBuffer.flip();  // 反转，变成读操作
    System.out.println("byteBuffer.get()：" + (char) byteBuffer.get()); // c
    System.out.println("byteBuffer.position(): " + byteBuffer.position()); // 当前指针位置，读操作从0开始，已经到 1 位置了
    System.out.println("byteBuffer.limit(): " + byteBuffer.limit()); // 表示真实存储了内容的极限位置
    System.out.println("byteBuffer.capacity(): " + byteBuffer.capacity());  // 总量 10
    System.out.println("byteBuffer.hasRemaining(): " + byteBuffer.hasRemaining()); // true，是否还有存量
    System.out.println("byteBuffer.remaining(): " + byteBuffer.remaining());  // 5，表示还有多少没被读。一开始的值就是limit()的值
    System.out.println("*************************");

    byteBuffer.mark(); //   标记一下
    byte[] buffer = new byte[3]; // 新建一个用于接收内容的数组
    byteBuffer.get(buffer);
    System.out.println("读到3个字节的内容：" + new String(buffer));
    System.out.println("*************************");

    byteBuffer.reset();   // 重置
    // 与读3个字节之前的数据一模一样
    System.out.println("byteBuffer.position(): " + byteBuffer.position()); // 当前指针位置，读操作从0开始，已经到 1 位置了
    System.out.println("byteBuffer.limit(): " + byteBuffer.limit()); // 表示真实存储了内容的极限位置
    System.out.println("byteBuffer.capacity(): " + byteBuffer.capacity());  // 总量 10
    System.out.println("byteBuffer.hasRemaining(): " + byteBuffer.hasRemaining()); // true，是否还有存量
    System.out.println("byteBuffer.remaining(): " + byteBuffer.remaining());  // 5，表示还有多少没被读。一开始的值就是limit()的值
    System.out.println("*************************");
  }
}
